#include "Chapter6StatementsAndlogical.h"
#include "HelloWorld.h"
#include <string>
#include <vector>
#include <cstring>
#include <array>
#include <iostream>
#include <ostream>
#include <random>
#include <ctime>
#include <fstream>
#include <iomanip>

#define Ch6 Chapter6StatementsAndlogical
using namespace std;


void Ch6::ifStatements()
{
    int i=0;
    int j=0;
    char ch;
    cin.get(ch);
    //#if
    /*
    while (ch != '.'){
        if (ch == ' ')
          i++;
        j++;
        cin.get(ch);
    }
    cout<<"空格数"<<i<<'\n';
    cout<<"字符数"<<j<<'\n';
    */

    //#if else
    /*while (ch != '.')
    {
        if (ch == '\n')
            cout<<ch;
        else
            //ch+1输出变成数字了。++ch 字母往后移动1位
            cout<<++ch;
    cin.get(ch);
    }*/

    //#if else if else
    cout<<"输入一个1-100的数字:";
    const int fave =27;
    //这里开始写的char n出错了.不打断点看不出...
    int n;
    do
    {
        cin>>n;
        if(n > fave)
            cout<<"too more"<<'\n';
        else if(n < fave)
            cout<<"too less"<<'\n';
        else 
            cout<<"你猜对了"<<'\n';
    }
    while (n!= fave);
}

const int ArSize =6;

//判断是否在范围内
bool is_int(double d)
{
    if(d<INT_MAX&&d>INT_MIN){
        return true;
    }
    return false;
};
void Ch6::logicalTest()
{
    // 表达式|| 如果左侧是ture不会判定右侧.
    // ++i和i++的不同，先加在比较vs先比较在加
    int i=6;
    int j=6;
    cout<<(--i<6||i==j)<<'\n';
    
    //& while for中使用
    /*float naaq[ArSize];
    cout << "请输入邻居的新时代意识商数（NAAQs）" 
     << "当您输入" << ArSize << "个条目"
     << "或输入一个负数值时，程序将终止。\n";
    i=0;
    float temp;
    cout<<"第一个值: ";
    cin>>temp;
    while (i<ArSize&&temp>=0)
    {
        naaq[i] = temp;
        ++i;
        if (i<ArSize)
            {
                cout<<"下一个值: ";
                cin>>temp;
            }
    }
    if (i==0)
        cout<<"没有录入数据,再见\n";
    else
    {
        cout<<"输入你的naaq:";
        float you;
        cin>>you;
        int count=0;
        for (j=0;j<i;j++)
            if (naaq[j]>you)
                ++count;
        cout<<count;
        cout<<" 这是比你的数，更大的数字的个数";
    }*/

    //if elseif 中使用&&.不要写成17<age<35;这种会判断称(17<age)<35
    /*
    const char *qualify[4] = {"1000米跑","泥潭拔河","师傅划船决斗","扔馅饼大赛",};
    int index;
    int age;
    cout<<"输入年龄: ";
    cin>>age;
    if (age>17&&age<35)
        index=0;
    else if (age>35&&age<50)
        index=1;
    else if (age>50&&age<65)
        index=2;
    else
        index=3;
    cout<<qualify[index];
    */

    //否定逻辑

    /*double num;
    cout<<"输入一个数:";
    cin>>num;
    while (!is_int(num))
    {
        cout<<"您输入的数字超出范围,从新输入:";
        cin>>num;
    }
    //用int(num)或static_cast<int>(num)可以将double类型的变量num转换为int类型。
    int val = int(num);
    cout<<"你输入的数字是:"<<val<<'\n';*/

    //!的优先级 与++和>,||比较
    //!0==true;!数字==flase
   //bool flag=(!6<=0);
   int flag=!6-1;
    cout<<"flag (!6-1) = "<<flag;
}

//只能判断char类型
void Ch6::cctypeTest()
{
    //判断英文字符:isalpha(ch)返回一个非零,这个方法比使用<=更方便
    char ch='A';
    if (isalpha(ch))
        cout<<isalpha(ch)<<'\n';
    if (ch>='a'&&ch<='z'||ch>='A'&&ch<='Z')
        cout<<ch<<'\n';
    
    //ispunct() 如果是都好或者句号返回ture
    //ispunct() 用于检查给定的字符是否是标点字符
    char ch1 ='1';
    cout<<"ispunct(ch1) :"<<ispunct(ch1)<<'\n';

    //使用isspace()来检测字符是否是空白
    char ch2 =' ';
    cout<<isspace(ch2)<<'\n';

    //sidigit(ch)是否是数字
    char ch3='1';
    cout<<isdigit(ch3)<<'\n';
}

//(?:)
void Ch6::expression123Test()
{
    //expression1?expression2:expression3 代替if elese
    //(?:)
    /*int i = 5>3?10:12;
    cout<<i<<'\n';*/

    int i, j ,k;
    cout<<"输入i 和 j两个数字\n";
    cin>>i>>j;
    cout<<"你输入的i = "<<i<<",j = "<<j;
    k = i>j?i:j;
    cout<<"大的数字是 :"<<k<<'\n';
    
}


//switch 和if else的区别.if更通用,用于处理范围值,浮点和两个量的比较.
//switch不是为了取值范围设计的,每一个case有一个整数值(char),不少于3个值时,使用
void Ch6::switchTest()
{   
    int i=6;
    //switch语句 搭配枚举使用
    enum myEnum {Abc=1 ,Bcd=2,Cde=3,Def=4};
    int my = 1;
    //my=Abc;
    //while循环时候,会将enum转化int;如果输入的不是5,会一直循环
    /*while (my!=5){
    switch (my){
        case 1: cout<<"Abc"<<'\n'; break;
        case 2: cout<<"Bcd"<<'\n'; break;
        case 3: cout<<"Cde"<<'\n'; break;
        case 4: cout<<"Def"<<'\n'; break;
        default:cout<<"Error"<<'\n'; break;
    }
        cin>>my;
    }*/
    
    //switch,没有break的情况
    char choice;
    cin>>choice;
    while (choice!='Q'&&choice!='q')
    {
        switch (choice)
        {
            case 'a':
                case 'A':cout<<"\a";
            break;
        case 'r':
            case 'R':cout<<"report()";
            break;
        case 'l':
            case 'L':cout<<"The boss was in all day .\n";
            break;
        case 'c':
            case 'C':cout<<"comfort()";
            break;
        default:cout<<"that`s not a choice.\n";
        }
        cout<<"菜单"<<'\n';
        cin>>choice;
    }
}

//多数情况下,goto语句被认为不好.使用break和continue代替;
void Ch6::breakAndContinue()
{
    const int Arsize = 80;
    int spaces=0;
    char line[Arsize];
    cin.get(line,Arsize);
    for(int i=0;line[i] != '\0';i++)
    {
        if (line[i]=='.')
            break;
        if (line[i]!=' ')
            continue;
        spaces++;
    }



    /*if (spaces < 1) {
        goto paris; // 跳转到标签 'start'
    }

    cout << "Loop is finished." << '\n';

    cout<<"\n"<<spaces<<" spaces\n";
    cout<<"Done .\n";
    
    paris: // 这是一个标签
    cout << "spaces is zero"<< '\n';*/

    //if else代替goto,通常使用if else.
    if (spaces < 1)
    {
        cout << "spaces is zero"<< '\n';
    }
    cout << "Loop is finished." << '\n';
    cout<<"\n"<<spaces<<" spaces\n";
    cout<<"Done .\n";
}

//业务:用户输入0~5条鱼的种类,给出所有鱼的重量平均值.如果输入的不是double类型(输入q).就会自动推出
//当用户输入q时，cin流会进入错误状态，因为q不能被转换为一个double类型。
//当cin遇到这样的输入错误时，它将停止进一步读取输入，并且while循环的条件将不再满足，因此循环会结束。
void Ch6::fishCount()
{
    const int Max = 5;
    double fish[Max];
    cout<<"请输入您捕获的鱼类的重量\n";
    cout<<"您可以输入最多"<<Max<<"条鱼的重量,<q结束>"<<'\n';
    cout<<"fish #1(单位kg):";
    int i=0;
    //循环录入鱼的重量，cin输入的不是double类型就会返回false

    while (i<Max&&cin>>fish[i])
    {
        if (++i<Max)
            cout<<"fish #"<<i+1<<": ";
    }
    //使用if(!cin) 判断输入流.正确.并且使用clear()清除 cin 的错误标志
    //cin >> fish[i]在输入英文字母时报错
    /*while (i < Max && cin >> fish[i]) {
        if (++i < Max) {
            cout << "fish #" << i + 1 << ": ";
        }
        if (!cin) {
            cout << "!cin\n";
            cin.clear(); // 清除错误标志
            break; // 退出循环
        }
    }*/
    //记录总的重量，取得平均值
        double total=0.0;
        for (int j=0;j<i;j++)
            total+=fish[j];
        if (i==0)
            cout<<"No fish \n";
        else
            cout<<total /i<< " kg = average weight of "<< i<<" fish"<<'\n';
        cout<<"Done.\n";
        
    
    
}

//业务,用户输入5次高尔夫的分数,求平均值,如果输入的错误的数据类型,提示用户并且从新输入
void Ch6::golfCount()
{
    const int Max = 5;
    int golf[Max];
    int i =0;
    while (i<Max)
    {
        
        cin>>golf[i];
        //遇到了错误,isdigit()只能判断char类型是数字.入参本来就是int.要用cin.fail()
       //if(!isdigit(golf[i]))

        //cin.fail()可以判断输入流错误.golf[i]输入类型必须是int
       //if(cin.fail())

        //使用cin>>golf[i].如果输入类型不正确,则返回false
        if (!cin >> golf[i])
        {
           cout<<"输入分数必须是数字\n";
           // 清除错误状态
           cin.clear();
           // 清空换行符之前的输入.以及换行符本身.
           cin.ignore(numeric_limits<streamsize>::max(), '\n');
           continue; // 继续下一次循环
        }
            
        cout<<"golf #"<<i+1<<": "<<golf[i]<<'\n';
        i++;
    }
    double total=0.0;
    for (int j=0;j<i;j++)
        total+=golf[j];
    if (i==0)
        cout<<"No golf \n";
    else
        cout<<total /i<< " is average scos of "<< i<<" golf"<<'\n';
    cout<<"Done.\n";
}

//简单的文件输出fstream(包含在iostream库中)
//1包含一个头文件ofstream
//2创建一个ofstream对象
//3将该对象同一个文件关联起来open
//4 就像使用cout那样使用该ofstream对象
//5 最后关闭
void Ch6::ofStreamTest()
{
    char automobile[50];
    int year;
    double a_price;
    double d_price;

    ofstream outFile;
    outFile.open("output.txt");
    cout<<"输入汽车的品牌和型号:";
    cin.getline(automobile,50);
    cout<<"Enter the year:";
    cin>>year;
    cout<<"Enter the price:";
    cin>>a_price;
    d_price = 0.913 * a_price;

    //display information on screen with cout
    cout<<fixed;
    cout<<setprecision(2);
    cout.setf(ios_base::showpoint);
    cout<<"Make and model: "<< automobile<<'\n';
    cout<<"Year: "<<year<<'\n';
    cout<<"Was asking: "<<a_price<<'\n';
    cout<<"Now asking: "<<d_price<<'\n';

    //now do exact same using outFile instead of cout
    //如果打开已经存在的文件.默认长度截断为0.原内容将丢失
    outFile<<fixed;
    outFile<<setprecision(4);
    outFile.setf(ios_base::showpoint);
    outFile<<"Make and model: "<< automobile<<'\n';
    outFile<<"Year: "<<year<<'\n';
    outFile<<"Was asking: "<<a_price<<'\n';
    outFile<<"Now asking: "<<d_price<<'\n';
    outFile.close();
    
}
bool isVowel(char ch) {
    // 将字符转换为小写，方便比较
    ch = tolower(ch);
    // 判断是否是元音
    return (ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u' || ch == 'y');
}


//文件输入
//1包含一个头文件fstream(包含在iostream库中)
//2创建一个ifstream对象
//3将该对象同一个文件关联起来open
//4 就像使用cout那样使用该ofstream对象
//5 最后关闭
const int SIZE = 60;
void Ch6::ifStreamTest()
{
    ifstream inFile;
    char filename[SIZE];
 
    cout<<"文件名称:";
    cin.getline(filename,SIZE);
    inFile.open(filename);
    if (!inFile.is_open())
    {
        cout<<"不能打开文件"<<'\n';
        cout<<"文件运行中!"<<'\n';
        exit(EXIT_FAILURE);
    }
    double value;
    double sum = 0.0;
    int count = 0;
    //写两次会造成重复度,读取第一个元素.第二次读取从第二个元素开始
    //inFile>>value; 
    while (inFile >> value) {
        sum += value;
        ++count;
    }
    // 检查是否因为到达文件末尾而结束循环
    if (inFile.eof())
        cout<<"文件结束\n";
    else if (inFile.fail())
        cout<<"文件输入出错\n";
    else
        cout<<"文件输入未知错位\n";
    if (count ==0)
        cout<<"没有数据\n";
    else
    {
        cout<<"Items read:"<<count<<'\n';
        cout<<"Sum:"<<sum<<'\n';
        cout<<"Average:"<<sum /count<<'\n';
        
    }
    
    inFile.close(); // 关闭文件
}

//复习题
void Ch6::reviewQuestions()
{
    //1 If if 会单独判断每个条件，相互独立。If else是逻辑判断，如果第一个条件成了，则不会运行后面的逻辑。
    
    //2 i++和i+1 和++i的区别
    /*int j =i++;// j = 5, i = 6
    j =i +1;// j = 6, i = 5
    j =++i;// j = 6, i = 6*/

    //3
    char c1;
    int c2,c3;
     c2=c3=0;
    
    //cin.get() 是 while 条件表达式的一部后，每次循环开始时都会调用它，导致c1 的值被重新赋值。
    /*while ((c1=cin.get())!='$')
    {
        if (c1=='\n')continue;//第一次按回车以后cin.get()会读取\n,所以会执行两次.
        cout<<"before c1 = "<<c1<<'\n';
        c2++;
        if (c1 = '$')
            c3++;
        cout<<"after c1 = "<<c1<<'\n';
    }
    cout<<"c2="<<c2<<",c3="<<c3<<'\n';*/

    //4
    int weight =135;
    cout<<(weight>=115)&&(weight<=125);
    //改进
    cout<<(weight>=115&&weight<=125);
    /*while (cin.get()=='q'||cin.get()=='Q')
    {
        cout<<"q or Q";
    };*/

    //x是偶数但是不是26
    c2=0;
    if (c2%2==0&&c2!=26)cout<<"是偶数,但是不等于26"<<'\n';
    //c2 1000-2000 或者c3 =1
    c3 =5;
    c2=1111;
    if ((c2>=1000&&c2<=2000)||c3==1)cout<<"c2 1000-2000 或者c3 =1"<<'\n';

    //c1 是大小写字母 isalpha(c1)
    /*cin.get(c1);
    if (isalpha(c1))cout<<"输入的是字母 :"<<c1;*/

    //5x和！！x是否一样。答：如果是波尔类型是相同的。！！x返回布尔
    int x=-5;
    cout<<x<<'\n';
    cout<<!!x<<'\n';
    
    //6 创建一个条件表达式,表示绝对值.如果x是整数返回x.如果是负数返回-x
    if (x<0)x=x*-1;
    cout<<x<<'\n';
    //7 使用switch 改写if else char=A B C D的计数
    /*int charA,charB,charC,charD;
    charA=0;
    charB=0;
    charC=0;
    charD=0;
    cin.get(c1);
    switch(c1){
        case('A'):
            charA++;
        break;
        case('B'):
            charB++;
        break;
        case('C'):
            charC++;
        break;
        case('D'):
            charD++;
        break;
    default:break;
    }
    cout<<charA<<'\n';
    cout<<charB<<'\n';
    cout<<charC<<'\n';
    cout<<charD<<'\n';*/

    //8 switch 的case条件使用数字和字母的区别。逻辑上，表述上，间接性上的区别

    //9 不使用break 和continue 完成 输入 q推出，回车继续，其他++char
    int i=0;
    char line;
    /*while (cin.get(line))
    {
        if (line == 'Q')
            break;
        if (line == '\n')
            continue;
        line++;
    }*/
    //修改后
    cin.get(line);
    while (line!='Q')
    {
        if (line!='\n');
        i++;
        cin.get(line);
    }
    cout<<"i = "<<i;
}

const int strsize =18;
struct bop
{
    char fullname[strsize];
    char title[strsize];
    char bopName[strsize];
    int preference;
};

char* getPreference(bop *b)
{
    /*switch (b.preference)
    {
        case 1: return b.fullname;
        case 2: return b.title;
        case 3:
        default : return b.bopName;
    }*/
    switch (b->preference) {
    case 1:
        return b->fullname;
    case 2:
        return b->title;
    //警告了和default一样,可以合并
    //case 3: return b->bopName;
        case 3:
    default: return b->bopName;
    }
}
void Ch6::CodeTest()
{
    //1 @终止输入，输入的字母大小写互换
    
    /*char c1;
    int i=0;

    //1使用字符数组需要初始化容量.不能超出
    //char c2[100];
    
    //2自动扩展容量：std::string 会自动管理内存，无需担心缓冲区溢出。
    string c2;
    
    cin>>c1;
    while (c1!='@')
    {   
        if (isalpha(c1))
        {
           
            if  (c1 >= 'A' && c1 <= 'Z')
            {
               c1=c1+32;
            }
            else if(c1 >= 'a' && c1 <= 'z')
            {
                c1=c1-32;
            }
        }
        //1使用char数组存储
       // c2[i]=c1;
       // i++;

        //2使用string 存储
        c2.push_back(c1);
        cin>>c1;
    }
    //使用string不需要再数组末尾加终止符.
    //c2[i] = '\0'; // 添加字符串终止符 
    cout<<c2;*/

    //2 10个double 数字,输入array.求平均值和大于平均值的数字.遇到非数字结束
    /*array<double,10> arg;
    double sum=0.0;
    int moreCount=0;
    int count = 0; // 记录成功输入的个数
    double input;
    while (count < 10) {
        cin >> input; // 尝试读取一个 double 值
        if (cin.fail())break; // 输入失败，退出循环
        arg[count] = input; // 将输入的值存储到数组中
        sum += arg[count];
        count++; // 成功输入一个值，计数器加 1
    }
     double pingjung = sum/count;
    for (int i = 0; i < count; i++) 
    {
        if (arg[i]>pingjung)
            moreCount++;
    }
    cout<<"平均 :"<< pingjung<<'\n';
    cout<<"大于平均数,数字的个数:"<< moreCount<<'\n';*/
    
    //3 switch 制作一个菜单选择程序.如果没有输入abcd.提示输入abcd.
    /*cout<<"输入A B C D选择一个你最喜欢的选项:"<<'\n';
    cout<<"A :吃美食    B:看书"<<'\n';
    cout<<"C :运动.    D:玩游戏"<<'\n';
    char like;
   
    while (true){
        cin>>like;
    switch (like)
    {
        case 'A':cout<<"你最喜欢吃米饭!";
        break;
        case 'B':cout<<"你最喜欢看小说!";
        break;
        case 'C':cout<<"你最喜欢运动!";
        break;
        case 'D':cout<<"你最喜欢打游戏!";
        break;
        default:
            cout<<"只能输入A ,B ,C ,or D :"<<like<<'\n';
            continue;
    }
        // 如果用户输入了有效选项，可以在这里添加其他逻辑
        break;  // 退出循环（如果需要）
    }*/

    //4 编写一个程序 ,使用构造体 初始化成员的真实名字,bopName(秘密名字),编号,和工作头衔
    //如果选择a 输出如下
    /*Wimp macho
     *Raki Rhodes
     *Celia Laiter
     *Hoppy Hipman
     *Pat Hand
    */
    //如果选择d输出如下
    /*Wimp macho
    *Junior Programmer
    *MIPS
    *Analyst Traninee
    *LOOPY
   */
    //如果选择q，输出bye!
   /*
    *    string a = "display by name";
     string b = "display by title";
     string c = "display by bopName";
     string d = "display by preference";
     string q = "quit";
     cout<<"a:"<<a<<".   b:"<<b<<'\n';
     cout<<"c:"<<c<<".   d:"<<d<<'\n';
     cout<<"q:"<<q<<'\n';
    * bop Wimp{"Wimp macho","bos","Wmacho",1};
    bop Raki{"Raki Rhode","Junior Programmer","RRhode",2};
    bop Celia{"Wimp macho","MIPS","Wmacho",2};
    bop Hoppy{"Hoppy Hipman","Analyst Traninee","HHipman",2};
    bop Pat{"Pat Hand","Analyst Traninee","LOOPY",3};
    char char4;
    while (true){
        cin>>char4;
    switch (char4)
    {
    case('a'):
        cout<<Wimp.fullname<<'\n';
        cout<<Raki.fullname<<'\n';
        cout<<Celia.fullname<<'\n';
        cout<<Hoppy.fullname<<'\n';
        cout<<Pat.fullname<<'\n';
        break;
    case('b'):
        cout<<Wimp.title<<'\n';
        cout<<Raki.title<<'\n';
        cout<<Celia.title<<'\n';
        cout<<Hoppy.title<<'\n';
        cout<<Pat.title<<'\n';
        break;
    case('c'):
        cout<<Wimp.bopName<<'\n';
        cout<<Raki.bopName<<'\n';
        cout<<Celia.bopName<<'\n';
        cout<<Hoppy.bopName<<'\n';
        cout<<Pat.bopName<<'\n';
        break;
    case('d'):
        cout<<getPreference(&Wimp)<<'\n';
        cout<<getPreference(&Raki)<<'\n';
        cout<<getPreference(&Celia)<<'\n';
        cout<<getPreference(&Hoppy)<<'\n';
        cout<<getPreference(&Pat)<<'\n';
        break;
    case('q'):cout<<"Bye!"<<'\n';break;
    default:cout<<"只能输入a,b,c,d,or q.请重新输入!"<<'\n';
        continue;
    }
        break;
    }*/

    //5 王国Neutronia 税收
        /*5000tvarps 不收税
        5001~15000 tvarps:10%
        15000~35000 tvarps:15%
        35000以上:20%
        列38000,收税=5000*0.00+10000*0.1+20000*0.15+3000*0.2
    */
   /* double int5;
    double s0=0;
    double s1=0.1;
    double s2=0.15;
    double s3=0.2;
    
    double q1=5000;
    double q2=15000;
    double q3=35000;
    //35000以上:20%
    double jbs=5000*s0+10000*s1+20000*s2;
    cin>>int5;
    if (int5<=q1)
    {   
        cout<<s0*int5<<'\n';
    }else if (int5>q1&&int5<=q2)
    {   
        cout<<s1*int5<<'\n';
    }else if (int5>q2&&int5<=q3)
    {
        cout<<s2*int5<<'\n';
    }else if (int5>q3)
    {
         cout<<jbs+(int5-35000)*s3<<'\n';
    }*/

    //6 统计捐钱的款项,金额 ,姓名.可以不写款项用none. 用户捐钱的系统.统计捐钱超过1w的用户姓名
  struct Donation {
        double money;
        string name;
        string title;
    };
    /*  string str6;
    Donation donations[strsize];
    
    int count=0;
    cout<<"捐钱系统开启,录入数据输入:";
    cin>>str6;
    
    while (str6!="q")
    {
        cout<<"请输入:"<<'\n';
        cout<<"姓名:"<<'\n';
        cin>>donations[count].name;
        cout<<"钱数:"<<'\n';
        cin>>donations[count].money;
        cout<<"款项:"<<'\n';
        cin>>donations[count].title;
        count++;
        cout<<"是否继续录入,q推出";
        cin>>str6;
    }
    cout<<"捐钱大于100元的有:"<<'\n';
    for (int i=0;i<strsize;i++)
    {
        if (donations[i].money>100)
        {   
            cout<<"姓名:"<<donations[i].name<<'\n';
            cout<<"金钱:"<<donations[i].money<<'\n';
            cout<<"款项:"<<donations[i].title<<'\n';
        }
    }*/

    //7 没次读取一个单词,直到用户输入q.然后指出有多少单词是元音打头,有多少个单词是辅音打头.还有多少不属于这两类.
    //元音是指字母 A、E、I、O、U（有时也包括 Y）。辅音是指除了元音字母（A、E、I、O、U）以外的其他字母。
    //方法之一:使用isalpha()来区分以字母和其他字符打头的单词.然后对于通过了isalpha()测试的单词.使用if 或switch语句
    //来确定那些以元音打头.该程序运行情况如下:
    /*Enter words (q to quit):
    The 12 awesome oxen ambled
    quietly across 15 meters of lawn. q
    5 words beginning with vowels
    4 words beginning with consonants
    2 others*/
   /*string word;
    int vowelCount = 0;  // 元音开头的单词数量
    int consonantCount = 0;  // 辅音开头的单词数量
    int otherCount = 0;  // 其他情况的单词数量

    cout << "请输入单词（输入 q 结束）：" << endl;

    while (true) {
        cin >> word;  // 读取一个单词
        // 检查是否退出
        if (word == "q" && cin.peek() == '\n') {  // 如果输入 q 并按下回车键
            break;
        }
        if (word.empty()) {  // 如果单词为空，跳过
            continue;
        }
        char firstChar = word[0];  // 获取单词的首字母
        if (isalpha(firstChar)) {  // 如果首字母是字母
            if (isVowel(firstChar)) {  // 如果是元音
                vowelCount++;
            } else {  // 否则是辅音
                consonantCount++;
            }
        } else {  // 如果首字母不是字母
            otherCount++;
        }
    }

    // 输出统计结果
    cout << "以元音开头的单词数量: " << vowelCount << '\n';
    cout << "以辅音开头的单词数量: " << consonantCount << '\n';
    cout << "其他情况的单词数量: " << otherCount << '\n';*/

    //8编写一个程序读取文件。并且支持文件有多少个字母 。
    /*ifstream inFile;
    inFile.open("output.txt");
    if (!inFile.is_open())
    {
        cout<<"不能打开文件"<<'\n';
        cout<<"文件运行中!"<<'\n';
        exit(EXIT_FAILURE);
    }
    int count = 0;
    char ch;
    //写两次会造成重复度,读取第一个元素.第二次读取从第二个元素开始
    //inFile>>value; 
    while (inFile >> ch) {
        if (isalpha(ch))
        ++count;
    }
    // 检查是否因为到达文件末尾而结束循环
    if (inFile.eof())
        cout<<"文件结束\n";
    else if (inFile.fail())
        cout<<"文件输入出错\n";
    else
        cout<<"文件输入未知错位\n";
    if (count ==0)
        cout<<"没有数据\n";
    else
    {
        cout<<"Items count:"<<count<<'\n';
    }
    inFile.close(); // 关闭文件*/

    //9 修改第六题。第一行输出捐款人数。雨下能容应为成对的行。每一行中第一行捐款人姓名。第二行捐款数额。
    /*
    4
    Sam stone
    2000
    Freida Flass
    100500
    Tammy Tubbs
    5000
    Rich Raptor
    55000
    */
    ifstream inFile;
    inFile.open("struct.txt");
    if (!inFile.is_open())
    {
        cout<<"不能打开文件"<<'\n';
        cout<<"文件运行中!"<<'\n';
        exit(EXIT_FAILURE);
    }
    // 统计文件中的数据条数
    int count = 0;
    string line;
    while (getline(inFile, line)) {
        ++count;
    }
    
    // 重置文件指针到开头
    inFile.clear();
    inFile.seekg(0, ios::beg);

    Donation* people = new Donation[count];
    // 读取文件中的数据
    for (int i = 0; i < count; ++i) {
        inFile >> people[i].name >> people[i].money >> people[i].title;
        // 将 name 中的 _ 替换为空格
        replace(people[i].name.begin(), people[i].name.end(), '_', ' ');
    }
    
    cout<<count<<'\n';
    // 输出读取的数据
    for (int i = 0; i < count; ++i) {
        cout <<people[i].name <<'\n';
        cout <<people[i].money <<'\n';
    }
    // 检查是否因为到达文件末尾而结束循环
    if (inFile.eof())
        cout<<"文件结束\n";
    else if (inFile.fail())
        cout<<"文件输入出错\n";
    else
        cout<<"文件输入未知错位\n";
    if (count ==0)
        cout<<"没有数据\n";
    else
    {
        cout<<"Items count:"<<count<<'\n';
    }
    inFile.close(); // 关闭文件*/
}


int main()
{
    Ch6 ch6;
    //randomSports();
    //ch6.ifStatements();
    //ch6.logicalTest();
    //ch6.cctypeTest();
    //ch6.expression123Test();
    //ch6.switchTest();
    //ch6.breakAndContinue();
    //ch6.fishCount();
    //ch6.golfCount();
    //ch6.ofStreamTest();
    //ch6.ifStreamTest();
    //ch6.reviewQuestions();
    ch6.CodeTest();
    
    return 0;
}
